import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Random;

public class MultiplicacionMatrices {
	
	private final static int MAX = 30;

	public static int readInt(String cartel) {
		String s = null;
		System.out.print(cartel);
		try{
			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
			s = in.readLine();
		} catch(IOException e){
			System.out.println("Error al leer");
			e.printStackTrace();
		}
		System.out.println();
		return Integer.parseInt(s);
	}

	public static int [][] cargarMatriz(int f,int c) {
		int [][] matrix = new int [f][c];		
		Random generator = new Random();
		for(int i=0; i<f; i++)
			for(int j=0; j<c; j++)
				matrix[i][j] = generator.nextInt(MAX);
		return matrix;		
	}	
	
	public static void imprimirMatriz(int [][] matrix,int f,int c) {
		System.out.println("********************************************************");
		System.out.println();
		for(int i=0; i<f; i++) {
			System.out.print("               ");
			for(int j=0; j<c; j++) {
				System.out.print(matrix[i][j]+"  ");
			}
			System.out.println();
		}
		System.out.println();
		System.out.println("********************************************************");
	}

	public static int resolver(int [][] fila,int f,int cantCol,int [][] columna,int cantFil,int c) {
		int res = 0;
		for (int i=0; i<cantCol; i++)
			for (int j=0; j<cantFil; j++)
				res = res + (fila[f][i]*columna[j][c]);
		return res;
	}
	
	public static void main(String args[]) {
		int filas1,columnas1,filas2,columnas2;
		filas1 = readInt("Ingrese cantidad de filas de la primer matriz: ");
		columnas1 = readInt("Ingrese cantidad de columnas de la primer matriz: ");
		filas2 = readInt("Ingrese cantidad de filas de la segunda matriz: ");
		columnas2 = readInt("Ingrese cantidad de columnas de la segunda matriz: ");
	 	int [][] matrix1,matrix2;
		matrix1 = cargarMatriz(filas1,columnas1);
		matrix2 = cargarMatriz(filas2,columnas2);
		imprimirMatriz(matrix1,filas1,columnas1);
		imprimirMatriz(matrix2,filas2,columnas2);
		if (columnas1 == filas2) { //*****************
			int [][] result = new int [filas1][columnas2];
			for(int i=0; i<filas1; i++)
				for(int j=0; j<columnas2; j++)
					result[i][j] = resolver(matrix1,i,columnas1,matrix2,filas2,j);
			imprimirMatriz(result,filas1,columnas2);
 		}
		else {
			System.out.println("La multiplicacion de matrices no se puede realizar por las dimensiones de las mismas");
		}
		
	
	}

}
